package simulacao;

import java.util.Random;

import model.Agencia;
import model.Cliente;
import model.StatusMensagemEnum;
import model.Terminal;
import exception.ContaInexistenteException;
import global.Global;

public class Atendimento extends Thread {
	
	Cliente cliente;
	Agencia agencia;
	Terminal terminal;
	int op;
	
	public Atendimento(Cliente cliente, Agencia agencia) {
		this.cliente = cliente;
		this.agencia = agencia;
	}
	
	public void run() {
		try {
			System.out.println("[" + this.getId() + "] entrou na fila");
			terminal = this.agencia.getControle().getTerminal();
			terminal.abrirSessao(this.cliente);
			StatusMensagemEnum resposta = StatusMensagemEnum.ERROINESPERADO;
			
			op = decidirOperacao();
			
			switch(op) {
				case 0: resposta = saque();
						break;
				case 1: resposta = deposito();
						break;
				case 2: resposta = transferencia();
						break;
			}

			System.out.println("[" + this.getId() + "] " + resposta.toString());

			terminal.fecharSessao();
		} catch(InterruptedException e) {
			e.printStackTrace();
		} catch (ContaInexistenteException e) {
			e.printStackTrace();
		}
	}
	
	private int decidirOperacao() {
		Random random = new Random();
		return random.nextInt(3);
	}
	
	public StatusMensagemEnum saque() throws ContaInexistenteException, InterruptedException {
		Random random = new Random();
		Integer valorInteiro = random.nextInt(2000) + 1;
		Integer valorDecimal = random.nextInt(100);			
		
		System.out.println("[" + this.getId() + "] Atendimento - Cliente\n   Conta: " + cliente.getCodConta() + " Agencia: " + cliente.getCodAgencia() + " esta no terminal " + terminal.toString() + "\n   Operacao: Saque - Valor desejado: " + valorInteiro + "," + (valorDecimal == 0 ? "00" : Global.correctDecimal(valorDecimal)));
		return terminal.sacar(valorInteiro, valorDecimal, this);
	}
	
	public StatusMensagemEnum deposito() throws ContaInexistenteException, InterruptedException {
		Random random = new Random();
		Integer valorInteiro = random.nextInt(2000);
		Integer valorDecimal = random.nextInt(100);
		
		if(random.nextInt(10) < 5) {
			System.out.println("[" + this.getId() + "] Atendimento - Cliente\n   Conta: " + cliente.getCodConta() + " Agencia: " + cliente.getCodAgencia() + " esta no terminal " + terminal.toString() + "\n   Operacao: Deposito - Valor desejado: " + valorInteiro + "," + (valorDecimal == 0 ? "00" : Global.correctDecimal(valorDecimal)) + "\n   Destino\n      Conta: " + cliente.getCodConta() + " Agencia: " + cliente.getCodAgencia());
			return terminal.depositar(valorInteiro, valorDecimal, cliente.getCodConta(), cliente.getCodAgencia(), this);
		} else {
			GeneratedInfo gi = Global.geraDados(agencia);
			System.out.println("[" + this.getId() + "] Atendimento - Cliente\n   Conta: " + cliente.getCodConta() + " Agencia: " + cliente.getCodAgencia() + " esta no terminal " + terminal.toString() + "\n   Operacao: Deposito - Valor desejado: " + valorInteiro + "," + (valorDecimal == 0 ? "00" : Global.correctDecimal(valorDecimal)) + "\n   Destino\n      Conta: " + gi.getCodConta() + " Agencia: " + gi.getCodAgencia());
			return terminal.depositar(valorInteiro, valorDecimal, gi.getCodConta(), gi.getCodAgencia(), this);
		}
	}
	
	public StatusMensagemEnum transferencia() throws ContaInexistenteException, InterruptedException {
		Random random = new Random();
		Integer valorInteiro = random.nextInt(2000);
		Integer valorDecimal = random.nextInt(100);
		
		GeneratedInfo gi = Global.geraDados(agencia);
		while(gi.getCodConta() == cliente.getCodConta() && gi.getCodAgencia() == cliente.getCodAgencia()) {
			gi = Global.geraDados(agencia);
		}
		
		System.out.println("[" + this.getId() + "] Atendimento - Cliente\n   Conta: " + cliente.getCodConta() + " Agencia: " + cliente.getCodAgencia() + " esta no terminal " + terminal.toString() + "\n   Operacao: Transferencia - Valor desejado: " + valorInteiro + "," + (valorDecimal == 0 ? "00" : Global.correctDecimal(valorDecimal)) + "\n   Destino\n      Conta: " + gi.getCodConta() + " Agencia: " + gi.getCodAgencia());
		return terminal.transferir(valorInteiro, valorDecimal, cliente.getCodConta(), cliente.getCodAgencia(), gi.getCodConta(), gi.getCodAgencia(), this);
	}

}
